package com.silence.gmall.product.assembler;

import com.silence.gmall.product.domain.entity.SpuSaleAttrValue;
import com.silence.gmall.product.dto.SpuSaleAttrValueDto;
import org.mapstruct.*;

import java.util.List;

/**
 * @Author silence
 * @Date 2025-08-18 23:11
 * @Email 792245022@qq.com
 * @Version 1.0
 * @Description spu销售属性值工厂
 */
@Mapper(componentModel = MappingConstants.ComponentModel.SPRING)
public interface SpuSaleAttrValueFactory {

    /**
     * 将销售属性值DTO转换为销售属性值
     *
     * @param source       销售属性值DTO
     * @param spuId        商品ID
     * @param saleAttrName 销售属性名称
     * @return 销售属性值
     */
    @Named("spuSaleAttrValueDto2SpuSaleAttrValueWithContext")
    @Mapping(target = "spuId", expression = "java(spuId)")
    @Mapping(target = "saleAttrName", expression = "java(saleAttrName)")
    SpuSaleAttrValue spuSaleAttrValueDto2SpuSaleAttrValueWithContext(SpuSaleAttrValueDto source,
                                                                     @Context Long spuId, @Context String saleAttrName);

    /**
     * 将销售属性值DTO列表转换为销售属性值列表
     *
     * @param source       销售属性值DTO列表
     * @param spuId        商品ID
     * @param saleAttrName 销售属性名称
     * @return 销售属性值列表
     */
    @Named("spuSaleAttrValueDtoList2SpuSaleAttrValueListWithContext")
    @IterableMapping(qualifiedByName = "spuSaleAttrValueDto2SpuSaleAttrValueWithContext")
    List<SpuSaleAttrValue> spuSaleAttrValueDtoList2SpuSaleAttrValueListWithContext(List<SpuSaleAttrValueDto> source,
                                                                                   @Context Long spuId, @Context String saleAttrName);
}
